package com.dhecp.project.system.service;

import java.util.List;
import java.util.Map;

import com.dhecp.common.core.domain.AjaxResult;
import com.dhecp.project.system.domain.SysUserInfo;
import com.dhecp.project.system.domain.SysUserInfoSimple;

/**
 * 用户 业务层
 * 
 * @author ruoyi
 */
public interface SysUserInfoService{
	
    /**
     * 验证用户名和密码
     * @param params
     * @return UserInfo
     * @author DH-Xxj
     */
    SysUserInfo queryByUseridAndPass(String userId, String passWord);
    
    /**
     * 拓展用户登录验证
     * @param params
     * @return String (返回异常提示信息，返回空代表无异常)
     * @author DH-Xxj
     */
	String queryUserLoginException(Map<String, Object> params);

    /**
     * 通过用户编号查询用户信息
     * @param userId
     * @return 实体-UserInfo
     * @author DH-Xxj
     */
    SysUserInfo queryByUserId(String userId);
    
    /**
     * 通过用户企业微信ID查询用户信息
     * @param userId
     * @return 实体-UserInfo
     * @author DH-Xxj
     */
    List<SysUserInfo> queryByWeChatId(String enWeChatId);

    /**
     * 按条件查询用户列表 —— 精简数据
     * @param wherestrhand 自行组装的查询条件语句
     * @param nowherestr 若存在（任意值），表示不进行条件过滤
     * @param nodatascode 若存在（任意值），表示不进行数据权限控制
     * @return List-UserInfo
     * @author DH-Xxj
     * @throws Exception
     */
    List<SysUserInfoSimple> queryUserSimpleList(Map<String, Object> params) throws Exception;

    /**
     * 按条件查询指定角色类型（客户销售）用户列表 —— 精简数据
     * @param roleType 必要参数，示例：customerGUser（客户销售）、All（查询全部）、SW（商务类角色）、（XS）销售类角色，具体类型在表TS_RoleGuidType中查看和配置
     * @param gClient 可选参数，客户编号，当roleType=‘customerGUser’时，必需传对应客户编号
     * @return
     * @throws Exception
     * @author DH-Xxj
     */
	List<SysUserInfoSimple> queryRoleTypeUserSimpleList(Map<String, Object> params) throws Exception;

    /**
     * 通过daNid查询用户信息
     * @param daNid 必要参数：档案nid号
     * @return List - SysUserInfoSimple
     * @throws Exception
     * @author DH-Xxj
     */
	List<SysUserInfoSimple> queryUserSimpleListByDaNid(Map<String, Object> params) throws Exception;
    
    /**
     * 按条件查询用户列表
     * @param params
     * @param nowherestr 若存在（任意值），表示不进行条件过滤
     * @param nodatascode 若存在（任意值），表示不进行数据权限控制
     * @return List-UserInfo
     * @author DH-Xxj
     * @throws Exception
     */
    List<SysUserInfo> queryUserList(Map<String, Object> params) throws Exception;

    /**
     * 查询拥有指定角色的用户列表
     * @param roleguid 必要参数：角色guid号
     * @param nowherestr 若存在（任意值），表示不进行条件过滤
     * @param nodatascode 若存在（任意值），表示不进行数据权限控制
     * @return List-UserInfo
     * @author DH-Xxj
     * @throws Exception
     */
    List<SysUserInfo> queryUserListByRoleGuid(Map<String, Object> params) throws Exception;

    /**
     * 通过用户编号或用户名称查询用户信息
     * @param params
     * @param userIdOrUserName 必要参数：用户编号 或 用户名称
     * @return
     * @author DH-Xxj
     */
    List<SysUserInfo> queryUserListByUserIdOrUserName(Map<String, Object> params);

    /**
     * 查询指定机构下的用户列表
     * @param orgPathAll 必要参数：指定机构全路径
     * @return List-UserInfo
     * @author DH-Xxj
     */
    List<SysUserInfo> queryUserListByOrgPathAll(Map<String, Object> params);

    /**
     * 查询指定机构的管理者列表
     * @param orgPathAll 必要参数：指定机构全路径
     * @return List-UserInfo
     * @author DH-Xxj
     */
    List<SysUserInfo> queryManagersAllListByOrgPathAll(Map<String, Object> params);
    
    /**
     * 查询指定资料文件夹的管理者列表
     * @param guid 必要参数：资料文件夹guid
     * @return List-UserInfo
     * @author DH-Xxj
     */
    List<SysUserInfo> queryManagersAllListByGuid(Map<String, Object> params);

    /**
     * 按条件查询超级管理员列表
     * @param params
     * @return List-UserInfo
     * @author DH-Xxj
     * @throws Exception
     */
    List<SysUserInfo> querySuperUserList(Map<String, Object> params) throws Exception;

    /**
     * 新增用户信息
     * @param userInfoItems 对应实体类的json格式字符串
     * @return AjaxResult
     * @author DH-Xxj
     */
    AjaxResult insertUserInfo(Map<String, Object> params);

    /**
     * 分配用户角色
     * @param userId 当前分配角色的用户编码
     * @param infoItems 角色对应实体类的json格式字符串(必要键值：角色编码[guid])
     * @return AjaxResult
     * @author DH-Xxj
     */
    AjaxResult insertUserRole(Map<String, Object> params);

    /**
     * 删除用户信息
     * @param userInfoItems 对应实体类的json格式字符串
     * @return AjaxResult
     * @author DH-Xxj
     */
    AjaxResult deleteUserInfo(Map<String, Object> params);

    /**
     * 删除用户角色
     * @param userBindRoleItems 对应实体类的json格式字符串(用户编码[userId],角色编码[roleguid])
     * @return
     * @author DH-Xxj
     */
    AjaxResult deleteUserRole(Map<String, Object> params);

    /**
     * 修改 始终允许浏览器登录 字段
     * @param infoItems 对应实体类的json格式字符串，包含属性（userId：用户编号， browserLogin：始终允许浏览器登录）
     * @return AjaxResult
     * @author DH-Xxj
     */
	AjaxResult updateBrowserLogin(Map<String, Object> params);

    /**
     * 修改用户密码
     * @param upType 修改类型（"resetpwd":重置密码，无需提供原密码；"changepwd":修改密码，需要提供原密码）
     * @param userId 用户编号
     * @param newPwd 新用户密码
     * @param oldPwd 原用户密码，修改密码时需要提供，重置密码时可不提供
     * @return AjaxResult
     * @author DH-Xxj
     */
	AjaxResult updateUserPassWord(Map<String, Object> params) throws Exception;

    /**
     * 修改用户密码-本地
     */
	AjaxResult updateUserPassWordLocal(String userId, String newPwd);

    /**
     * 修改二级密码
     * @param upType 修改类型（"resetpwd":重置密码，无需提供原密码；"changepwd":修改密码，需要提供原密码）
     * @param userId 用户编号
     * @param newPwd2 新二级密码
     * @param oldPwd2 原二级密码，修改密码时需要提供，重置密码时可不提供
     * @return AjaxResult
     * @author DH-Xxj
     */
	AjaxResult updateUserPassWord2(Map<String, Object> params) throws Exception;

    /**
     * 修改用户信息
     * @param userInfoItems 对应实体类的json格式字符串
     * @param upType 修改类型（修改用户信息：upuser，修改用户基础信息：upuserbaseinfo，修改用户皮肤：upskin，修改档案照片：upuserphoto，修改用户头像：upuserpicture）
     * @return AjaxResult
     * @author DH-Xxj
     */
    AjaxResult updateUserInfo(Map<String, Object> params);

    /**
     * 绑定用户档案
     * @param infoItems 对应实体类的json格式字符串，包含属性（userId ：用户编号，daNid ：档案入职信息nid号）
     * @return AjaxResult
     * @author DH-Xxj
     */
	AjaxResult updateUserDaNid(Map<String, Object> params);

    /**
     * 查询用户列表，用于同步用户用
     * @param params
     * @return
     */
    List<SysUserInfo> queryUserListBySync(Map<String, Object> params);
    /**
     * 更新用户表第三方系统同步生成的unionid
     * @param userId
     * @param syncUnionId
     * @return
     */
    AjaxResult updateUserBySyncUnionId(String userId, String syncUnionId, String enWeChatId);


    /**
     * 获取用户角色id
     */
    String getUserRoleId(String userId);

    /**
     * 获取用户最高的运营公司
     */
    String getUserRouteCode(String userId);
}
